// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_NQE_WEIGHTED_OBSERVATION_H_
#define NET_NQE_WEIGHTED_OBSERVATION_H_

#include <vector>

#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
#include "net/nqe/network_quality_observation_source.h"

namespace net {

namespace nqe {

    namespace internal {

        // Holds an observation and its weight.
        template <typename ValueType>
        struct NET_EXPORT_PRIVATE WeightedObservation {
            WeightedObservation(ValueType value, double weight)
                : value(value)
                , weight(weight)
            {
            }
            WeightedObservation(const WeightedObservation& other)
                : WeightedObservation(other.value, other.weight)
            {
            }

            WeightedObservation& operator=(const WeightedObservation& other)
            {
                value = other.value;
                weight = other.weight;
                return *this;
            }

            // Required for sorting the samples in the ascending order of values.
            bool operator<(const WeightedObservation& other) const
            {
                return (value < other.value);
            }

            // Value of the sample.
            ValueType value;

            // Weight of the sample. This is computed based on how much time has passed
            // since the sample was taken.
            double weight;
        };

    } // namespace internal

} // namespace nqe

} // namespace net

#endif // NET_NQE_WEIGHTED_OBSERVATION_H_